package com.fhzn.auth.mapper;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fhzn.auth.entity.DataResource;

import java.util.List;

/**
 * @author 老顾
 * @apiNote
 * @since 2024/1/18
 */
public interface DataResourceMapper extends BaseMapper<DataResource> {

    /**
     * 获取用户的数据权限
     *
     * @param dataResourceIds 数据权限id列表
     * @param appCode         系统code
     * @param parentCode      父code
     * @return 数据权限列表
     */
    default List<DataResource> findUserDataResByNicknameAndParentCode(List<Integer> dataResourceIds, String appCode, String parentCode) {
        LambdaQueryWrapper<DataResource> wrapper = Wrappers.lambdaQuery();
        wrapper.in(DataResource::getId, dataResourceIds);
        wrapper.eq(DataResource::getAppCode, appCode);
        wrapper.eq(DataResource::getParentCode, parentCode);
        wrapper.orderByAsc(DataResource::getId);
        return selectList(wrapper);
    }

    /**
     * 根据资源获取用户
     *
     * @param code         数据权限code
     * @param appCode      系统code
     * @param resourceType 数据权限类型
     * @return 数据权限列表
     */
    default List<DataResource> getUsersByDataResource(String code, String appCode, Integer resourceType) {
        LambdaQueryWrapper<DataResource> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(DataResource::getCode, code);
        wrapper.eq(DataResource::getAppCode, appCode);
        wrapper.eq(DataResource::getResourceType, resourceType);
        return selectList(wrapper);
    }

    /**
     * 根据资源获取用户
     *
     * @param appCode 系统code
     * @param code    code
     * @return 数据权限列表
     */
    default DataResource selectDataResourceByCode(String appCode, String code) {
        LambdaQueryWrapper<DataResource> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(DataResource::getAppCode, appCode);
        wrapper.eq(DataResource::getCode, code);
        return selectOne(wrapper);
    }

    /**
     * 根据类型和Code查询资源
     *
     * @param appCode      应用名称
     * @param resourceType 资源类型
     * @param code         code
     * @return 数据资源信息
     */
    default DataResource selectDataResourceByTypeAndCode(String appCode, Integer resourceType, String code) {
        LambdaQueryWrapper<DataResource> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(DataResource::getAppCode, appCode);
        wrapper.eq(DataResource::getResourceType, resourceType);
        wrapper.eq(DataResource::getCode, code);
        return selectOne(wrapper);
    }
}
